<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="zh" xml:lang="zh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Concept: 组件</title>
<meta name="uma.type" content="Concept">
<meta name="uma.name" content="component">
<meta name="uma.presentationName" content="组件">
<meta name="element_type" content="concept">
<meta name="filetype" content="description">
<meta name="role" content="">
<link rel="StyleSheet" href="./../../../css/default.css" type="text/css">
<script src="./../../../scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/contentPage.js" type="text/javascript" language="JavaScript"></script><script type="text/javascript" language="JavaScript">
					var backPath = './../../../';
					var imgPath = './../../../images/';
					var nodeInfo=null;
					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
				</script>
</head>
<body>
<div id="breadcrumbs"></div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td valign="top"><a name="Top"></a>
<div id="page-guid" value="3.524150980437479E-305"></div>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="pageTitle" nowrap="true">Concept: 组件</td><td width="100%">
<div align="right" id="contentPageToolbar"></div>
</td><td width="100%" class="expandCollapseLink" align="right"><a name="mainIndex" href="./../../../index.htm"></a><script language="JavaScript" type="text/javascript" src="./../../../scripts/treebrowser.js"></script></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="pageTitleSeparator"><img src="./../../../images/shim.gif" alt="" title="" height="1"></td>
</tr>
</table>
<div class="overview">
<table width="97%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50"><img src="./../../../images/concept.gif" alt="" title=""></td><td>
<table class="overviewTable" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">组件是系统的封装部分，理论上是系统中相当重要的、几乎独立的可替换部分，它在明确定义的架构环境中实现明确的功能。</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Relationships</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<th class="sectionTableHeading" scope="row">Related Elements</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../rup/disciplines/rup_analysis_design_discipline_29760231.html" guid="_ydt62NnmEdmO6L4XMImrsA">分析与设计</a>
</li>
<li>
<a href="./../../../rup/domains/analysis_and_design_BD3BBB1D.html" guid="_kjFBYN7HEdm8G6yT7-Wdqw">分析与设计</a>
</li>
<li>
<a href="./../../../rup/workproducts/rup_design_model_2830034D.html" guid="{8CDAEAD4-5E84-4F50-87FD-3240ED047DE7}">设计模型</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Main Description</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<td class="sectionTableSingleCell"><a id="Top" name="Top"></a><a key="组件（component）" text="概念" name="XE_component__concepts" id="XE_component__concepts" class="index"></a> 
<h3>
    <b><a id="Introduction" name="Introduction">定义</a></b>
</h3>
<p>
    软件行业和文献中使用术语“组件”来指许多不同的事物。它通常用来泛指“构成其他事物的部分”。它还常用来特指使得能在较大系统中进行替换和装配的特定特征。
</p>
<p>
    在 NUP 中，我们使用术语“组件”来表示系统的封装部分，理论上是系统中相当重要的、几乎独立的可替换部分，它在明确定义的架构环境中实现明确的功能。这包括：
</p>
<ul>
    <li>
        设计组件 － 重要的设计封装部分，因此包含设计子系统，有时还包含重要的设计类和设计包。
    </li>
    <li>
        实现组件 － 重要的实现封装部分，通常是实现设计组件的代码。
    </li>
</ul>
<p>
    理论上，设计应反映实现，因此您可以只引用组件，每个组件均具有设计和实现。
</p>
<p>
    UML（[<a class="elementLinkWithUserText" href="./../../../rup/customcategories/references_56F06DFD.html#UML04" guid="7.755968586980351E-308">UML04</a>]）如下定义了“组件”：
</p>
<blockquote>
    <p>
        封装了内容的系统模块化部分，其表现形式在环境中是可替换的。 组件在提供的接口和必需的接口方面定义自己的行为。 这样，组件充当一个类型，其一致性由这些提供的和必需的接口定义（包含它们静态和动态的语义）。
    </p>
</blockquote>
<p>
    组件被定义为结构化类的子类型，这样，组件就具有属性和操作，能够参与关联关系和泛化关系，并具有内部的结构和端口。 请参阅<a class="elementLinkWithType" href="./../../../rup/guidances/concepts/structured_class_FF8DB16F.html" guid="1.1994826813129747E-304">Concept: 结构化类</a>以获取更多详细信息。
</p>
<p>
    存在许多适用于组件的 UML 标准构造型，例如用来为大规模组件建模的 &lt;&lt;subsystem&gt;&gt;，以及用来为具有明确规约和实现定义（其中一个规约可以有多个实现）的组件建模的
    &lt;&lt;specification&gt;&gt; 和 &lt;&lt;realization&gt;&gt;。
</p>
<p>
    在 NUP 中，术语“组件”的使用要比 UML 的定义广泛。我们并不是仅仅将组件定义为具有诸如模块性、可部署性和可替换性之类的特征，而是建议组件应该具有这些特征。 关于组件可替换性，请参阅下面的部分。
</p>
<h3>
    <b><a id="Component_Replaceability" name="Component_Replaceability">组件可替换性</a></b>
</h3>
<p>
    在 NUP 和 UML 术语中，组件应是可替换的。不过，这可能仅仅意味着组件公开了一组隐藏底层实现的接口。
</p>
<p>
    存在其他更强的可替换性类型。它们在下面列出。
</p>
<h4>
    源文件可替换性
</h4>
<p>
    如果在单个源代码文件内实现两个类，则通常不能分别地为两个编排版本并控制这两个类。
</p>
<p>
    不过，如果一组文件完全实现单个组件，而不实现任何其他组件，那么该组件即为“源文件可替换”。 此特征使得更容易对组件源代码进行版本控制、设置基线以及重用。
</p>
<h4>
    部署可替换性
</h4>
<p>
    如果两个类在单个可执行文件中部署，那么每个类在已部署的系统中不能独立地替换。
</p>
<p>
    对较大粒度组件期望的特征是“部署可替换”，从而允许部署组件的新版本而无需重新构建其他组件。这通常意味着存在一个文件或一组文件来部署该组件而不部署任何其他组件。
</p>
<h4>
    运行时可替换性
</h4>
<p>
    如果某个组件可以重新部署到正在运行的系统中，则称为“运行时可替换”。这使得软件能在不损失可用性的情况下进行升级。
</p>
<h4>
    位置透明性
</h4>
<p>
    具有网络可寻址接口的组件可称为具有“位置透明性”。这使得组件能重新定位到其他服务器，或在多台服务器上复制，以支持故障容忍和负载均衡等等。 这些类型的组件通常称为“分布式”组件或“可分布”组件。
</p>
<h3>
    <b><a id="Component_Modeling" name="Component_Modeling">组件的建模</a></b>
</h3>
<p>
    UML 组件是一个建模结构，它提供以下能力：
</p>
<ul>
    <li>
        能对类进行分组以定义较大粒度的系统部件
    </li>
    <li>
        能分离可视界面和内部实现
    </li>
    <li>
        能拥有在运行时执行的实例
    </li>
</ul>
<p>
    组件有许多提供的和必需的接口，它们组成了将组件串在一起的基础。 提供的接口是直接由组件实现或者由它的实现类或子组件之一实现的接口，或者是提供的组件端口的类型。
    必需的接口由来自组件或者其实现类或子组件的用途依赖关系指定，或者是必需端口的类型。
</p>
<p>
    组件具有借助于公开可见的属性和操作的外部视图（或称为“黑匣”视图）。（可选）诸如协议状态机之类的行为可以连接到接口、端口以及组件本身，以通过使操作调用序列中的动态约束明确化，来更精确地定义外部视图。组件在系统中或其他环境中的串连可以通过使用组件接口之间的依赖关系来进行结构定义（通常是在组件图上）。
</p>
<p>
    （可选）可以通过在组合结构中使用部件和连接器，来制定更详细的结构协作规约，从而指定组件之间的角色或实例级别协作。 这是组件的内部视图（或称为“白匣”视图），它借助于组件的专用属性，以及实现类或子组件。该视图显示如何内部地实现外部行为。
    外部和内部视图之间的映射通过依赖关系完成（在组件图上），或者通过向内部部件委托连接器完成（在组合结构图上）。
</p>
<p>
    NUP 建议将组件用作设计子系统的表示方法。关于详细信息，请参阅<a class="elementLinkWithType" href="./../../../rup/workproducts/rup_design_subsystem_1A8D169B.html" guid="{A3C60B25-9780-4BFA-81AF-C1AD40D8A833}">Artifact: 设计子系统</a>、<a class="elementLinkWithType" href="./../../../rup/tasks/subsystem_design_5D1BCC0C.html" guid="{CAA385CA-2BA2-40F2-8FE3-E21089D02119}">Task: 子系统设计</a>和<a class="elementLinkWithType" href="./../../../rup/guidances/guidelines/design_subsystem_B26FD609.html" guid="1.2314266786534317E-305">Guideline: 设计子系统</a>。另请参阅<a class="elementLinkWithType" href="./../../../rup/guidances/concepts/structured_class_FF8DB16F.html" guid="1.1994826813129747E-304">Concept: 结构化类</a>中的定义。
</p>
<h3>
    <b><a id="Component_Instantiation" name="Component_Instantiation">组件实例化</a></b>
</h3>
<p>
    对于是否在运行时直接实例化组件，没有明确要求。
</p>
<p>
    间接实例化的组件通过一组类、子组件或部件实现或实现。组件本身不出现在实现中，它充当实现必须遵循的设计方案。 实现类、子组件或部件的集合必须涵盖在组件提供的接口中指定的整个操作集。实现组件的方式是实现者的职责。
</p>
<p>
    直接实例化的组件指定其自己的封装实现，它作为可寻址的对象进行实例化。这意味着设计组件在实现语言中具有相应的构造，因此能明确地引用。
</p>
<h3>
    <b><a id="UML_1x_Representation" name="UML_1x_Representation">UML 1.x 表示</a></b>
</h3>
<p>
    UML 1.5 如下定义了“组件”：
</p>
<blockquote>
    <p>
        系统中模块化的、可部署且可替换的部分，它封装实现，并暴露一组接口。 组件通常由一个或多个驻留在它上面的类或子组件指定，并可以由一个或多个工件（例如二进制文件、可执行文件或脚本文件）实现。
    </p>
</blockquote>
<p>
    请注意，在 UML 1.3 及更早的 UML 版本中，“组件”表示法用来表示实现中的文件。而在最新的 UML 定义中，文件不再视为“组件”。不过，许多工具和 UML 概要文件仍使用组件表示法来表示文件。请参阅<a class="elementLinkWithType" href="./../../../rup/guidances/guidelines/implementation_element_ECCAA21E.html" guid="1.0315418523886092E-305">Guideline: 实现元素</a>以获取更多关于在 UML 中表示文件的讨论。
</p>
<p>
    从建模角度来说，组件可与 UML 1.5 中的 UML 子系统相比，因为它们都提供模块性、封装以及能在运行时执行的实例。 NUP 将 UML 1.5 组件建模构造视为表示设计子系统的替代表示法。 关于详细信息，请参阅<a class="elementLinkWithType" href="./../../../rup/workproducts/rup_design_subsystem_1A8D169B.html" guid="{A3C60B25-9780-4BFA-81AF-C1AD40D8A833}">Artifact: 设计子系统</a>和<a class="elementLinkWithType" href="./../../../rup/guidances/guidelines/design_subsystem_B26FD609.html" guid="1.2314266786534317E-305">Guideline: 设计子系统</a>。<br />
    <br />
    关于更多信息，请参阅<a class="elementLink" href="./../../../rup/guidances/supportingmaterials/differences_between_uml_1_x_and_uml_2_0_CA70F2E6.html" guid="4.792914878943572E-306">UML 1.x 和 UML 2.0 之间的区别</a>。
</p></td>
</tr>
</table>
</div>
<table class="copyright" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="copyright">Copyright &copy; 2008 版权所有 东软集团股份有限公司&nbsp; 联系邮箱:<a href="mailto:tcoe@neusoft.com">tcoe@neusoft.com</a></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<script type="text/javascript" language="JavaScript">
				contentPage.onload();
			</script>
</html>
